﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace EnterpriseFund.Common
{
    public class Rmb
    {
        /// <summary> 
        /// 转换人民币大小金额 
        /// </summary> 
        /// <param name="num">金额</param> 
        /// <returns>返回大写形式</returns> 
        public static string CmycurD(decimal num)
        {
            decimal tmpNum = num;
            string str1 = "零壹贰叁肆伍陆柒捌玖";            //0-9所对应的汉字 
            string str2 = "万仟佰拾亿仟佰拾万仟佰拾元角分"; //数字位所对应的汉字 
            string str3 = "";    //从原num值中取出的值 
            string str4 = "";    //数字的字符串形式 
            string str5 = "";  //人民币大写金额形式 
            int i;    //循环变量 
            int j;    //num的值乘以100的字符串长度 
            string ch1 = "";    //数字的汉语读法 
            string ch2 = "";    //数字位的汉字读法 
            int nzero = 0;  //用来计算连续的零值是几个 
            int temp;            //从原num值中取出的值 

            num = Math.Round(Math.Abs(num), 2);    //将num取绝对值并四舍五入取2位小数 
            str4 = ((long)(num * 100)).ToString();        //将num乘100并转换成字符串形式 
            j = str4.Length;      //找出最高位 
            if (j > 15) { return "溢出"; }
            str2 = str2.Substring(15 - j);   //取出对应位数的str2的值。如：200.55,j为5所以str2=佰拾元角分 

            //循环取出每一位需要转换的值 
            for (i = 0; i < j; i++)
            {
                str3 = str4.Substring(i, 1);          //取出需转换的某一位的值 
                temp = Convert.ToInt32(str3);      //转换为数字 
                if (i != (j - 3) && i != (j - 7) && i != (j - 11) && i != (j - 15))
                {
                    //当所取位数不为元、万、亿、万亿上的数字时 
                    if (str3 == "0")
                    {
                        ch1 = "";
                        ch2 = "";
                        nzero = nzero + 1;
                    }
                    else
                    {
                        if (str3 != "0" && nzero != 0)
                        {
                            ch1 = "零" + str1.Substring(temp * 1, 1);
                            ch2 = str2.Substring(i, 1);
                            nzero = 0;
                        }
                        else
                        {
                            ch1 = str1.Substring(temp * 1, 1);
                            ch2 = str2.Substring(i, 1);
                            nzero = 0;
                        }
                    }
                }
                else
                {
                    //该位是万亿，亿，万，元位等关键位 
                    if (str3 != "0" && nzero != 0)
                    {
                        ch1 = "零" + str1.Substring(temp * 1, 1);
                        ch2 = str2.Substring(i, 1);
                        nzero = 0;
                    }
                    else
                    {
                        if (str3 != "0" && nzero == 0)
                        {
                            ch1 = str1.Substring(temp * 1, 1);
                            ch2 = str2.Substring(i, 1);
                            nzero = 0;
                        }
                        else
                        {
                            if (str3 == "0" && nzero >= 3)
                            {
                                ch1 = "";
                                ch2 = "";
                                nzero = nzero + 1;
                            }
                            else
                            {
                                if (j >= 11)
                                {
                                    ch1 = "";
                                    nzero = nzero + 1;
                                }
                                else
                                {
                                    ch1 = "";
                                    ch2 = str2.Substring(i, 1);
                                    nzero = nzero + 1;
                                }
                            }
                        }
                    }
                }
                if (i == (j - 11) || i == (j - 3))
                {
                    //如果该位是亿位或元位，则必须写上 
                    ch2 = str2.Substring(i, 1);
                }
                str5 = str5 + ch1 + ch2;

                if (i == j - 1 && str3 == "0")
                {
                    //最后一位（分）为0时，加上“整” 
                    str5 = str5 + '整';
                }
            }
            if (num == 0)
            {
                str5 = "零元整";
            }
            if (tmpNum < 0)
            {
                str5 = "负" + str5;
            }
            return str5;
        }

        /**/
        /// <summary> 
        /// 一个重载，将字符串先转换成数字在调用CmycurD(decimal num) 
        /// </summary> 
        /// <param name="num">用户输入的金额，字符串形式未转成decimal</param> 
        /// <returns></returns> 
        public static string CmycurD(string numstr)
        {
            try
            {
                decimal num = Convert.ToDecimal(numstr);
                return CmycurD(num);
            }
            catch
            {
                return "非数字形式！";
            }
        }

        private static string[] ArabinNum = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" };
        private static string[] ChnNum = { "零", "一", "二", "三", "四", "五", "六", "七", "八", "九", "十", "百", "千", "万", "亿" };
        private static string[] Union = { "", "十", "百", "千" };

        public static string ArabToChn(decimal ArabNum)
        {
            string neg = string.Empty;
            neg = (ArabNum < 0) ? "负" : "";
            string result = string.Empty;
            string[] part = (ArabNum.ToString().Replace("-", string.Empty)).Split('.');
            Int64 temp = Convert.ToInt64(part[0]);
            Int64 epart = temp;
            string dotpart =
            (part.Length > 1) ? part[1] : string.Empty;
            if (part.Length > 1)
            {
                dotpart = GetDotPart(dotpart);
            }
            string tmp = string.Empty;
            string lasttemp = string.Empty;
            for (int i = 0; i <= ((epart.ToString().Length - 1) / 4); i++)
            {
                int thousand = 0;
                thousand = Convert.ToInt32(temp % 10000);
                temp = temp / 10000;
                lasttemp = tmp;
                tmp = GetThousandPart(thousand);

                if (i == 0)
                {
                    result = tmp;
                    lasttemp = tmp;
                }
                if (i == 1)//返回的是万
                {
                    if (result == "零")
                    {
                        result = string.Empty;
                    }
                    result = tmp + "万" +
                    ((lasttemp.IndexOf("千") == -1 && lasttemp != "零") ? "零" : "") + result;
                }
                if (i == 2)//亿
                {
                    if (result.IndexOf("零万") != -1)
                    {

                        result = result.Replace("零万", string
                        .Empty);
                    }
                    result = tmp + "亿" +
                    ((lasttemp.IndexOf("千") == -1 && lasttemp != "零") ? "零" : "") + result;
                }
                if (i == 3)//万亿
                {
                    if (result.IndexOf("零亿") != -1)
                    {
                        result = result.Replace("零亿", "亿");
                    }
                    result = tmp + "万" +
                    ((lasttemp.IndexOf("千") == -1 && lasttemp != "零") ? "零" : "") + result;
                }
                if (i == 4)//亿亿
                {
                    if (result.IndexOf("零万") != -1)
                    {

                        result = result.Replace("零万", string
                        .Empty);
                    }
                    result = tmp + "亿" +
                    ((lasttemp.IndexOf("千") == -1 && lasttemp != "零") ? "零" : "") + result;
                }
            }
            result = neg + result + dotpart;

            return result;

        }

        /// <summary>
        /// 处理小数部分
        /// </summary>
        /// <param name="dotPart"></param>
        /// <returns></returns>
        private static string GetDotPart(string dotPart)
        {
            string result = "点";
            for (int i = 0; i < dotPart.Length; i++)
            {

                result += ChnNum[Convert.ToInt32(dotPart[
                i].ToString())];
            }
            for (int j = 0; j < result.Length; j++)
            //去除无效零或点
            {

                if (result[result.Length - j - 1].ToString() != "点" && result[result.Length - j - 1].ToString() != "零")
                {
                    break;
                }
                else
                {
                    result =
                    result.Substring(0, (result.Length - j - 1
                    ));
                }
            }
            return result;
        }

        /// <summary>
        /// 万位以下的分析
        /// </summary>
        /// <returns></returns>
        private static string GetThousandPart(int number)
        {
            if (number == 0)
            {
                return "零";
            }
            string result = string.Empty;
            bool lowZero = false;
            //记录低位有没有找到非零值，没找到置true
            bool befZero = false;
            //记录前一位是不是非零值，是0则置true
            int temp = number;
            int index = number.ToString().Length;
            for (int i = 0; i < index; i++)
            {
                int n = temp % 10;
                temp = temp / 10;
                if (i == 0) //起始位
                {
                    if (n == 0)
                    {
                        lowZero = true; //低位有0
                        befZero = true; //前位为0
                    }
                    else
                    {
                        result = ChnNum[n];
                    }
                }
                else
                {
                    if (n != 0)
                    {
                        result = ChnNum[n] + Union[i] + result;
                        lowZero = false;
                        befZero = false;
                    }
                    else
                    {
                        if (!lowZero)
                        {
                            if (!befZero)
                            //低位有数，且前位不为0，本位为0填零
                            //eg.5906
                            {
                                result = ChnNum[n] + result;
                                befZero = true;
                            }
                            else
                            //低位有数，且前位为0省略零eg. 5008
                            {
                            }
                        }
                        else //低位为0
                        {
                            if (!befZero)//理论上不存在eg 5080
                            {
                                result = ChnNum[n] + result;
                                befZero = true;
                            }
                            else //eg. 5000
                            {
                            }
                        }
                    }
                }
            }
            return result;
        }
        public static Decimal ChnToArab(string ChnNum)
　　　　{
　　　　　　Decimal result = 0;
　　　　　　string temp = ChnNum;
　　　　　　bool neg = false;
　　　　　　if(ChnNum.IndexOf("负")!=-1)
　　　　　　{
　　　　　　　　neg = true;
　　　　　　　　temp = temp.Replace("负",string.Empty);
　　　　　　}
　　　　　　string pre = string.Empty;
　　　　　　string abo = string.Empty;
　　　　　　temp = temp.Replace("点",".");
　　　　　　string[] part = temp.Split('.');
　　　　　　pre = part[0];
　　　　　　Decimal dotPart = 0;
　　　　　　if(part.Length>1)
　　　　　　{
　　　　　　　　abo = part[1];
　　　　　　　　dotPart = GetArabDotPart(abo);
　　　　　　}
　　　　
　　　　　　int yCount = 0;
　　　　　　//"亿"的个数，有可能出现亿亿。
　　　　　　//int yPos = 0;
　　　　　　　　
　　　　　　int index = 0;
　　　　　　while(index<pre.Length)
　　　　　　{
　　　　　　　　if(pre.IndexOf("亿",index)!=-1)
　　　　　　　　{
　　　　　　　　　　yCount++;
　　　　　　　　　　//yPos = pre.IndexOf("亿",index);
　　　　　　　　　　index = pre.IndexOf("亿",index)+1;
　　　　　　　　}
　　　　　　　　else
　　　　　　　　{
　　　　　　　　　　break;
　　　　　　　　}
　　　　　　}
　　　　　　if(yCount==2)//亿亿
　　　　　　{
　　　　　　　　pre = pre.Replace("亿",",");
　　　　　　　　string[] sp = pre.Split(',');
　　　　　　　　result =(neg?-1:1)*((HandlePart(sp[0])*10000000000000000)+(HandlePart(sp[1])*100000000)+HandlePart(sp[2]))+dotPart;　　
　　　　　　}
　　　　　　else
　　　　　　{
　　　　　　　　if(yCount==1)
　　　　　　　　{
　　　　　　　　　　pre = pre.Replace("亿",",");
　　　　　　　　　　string[] sp = pre.Split(',');
　　　　　　　　　　result =(neg?-1:1)*((HandlePart(sp[0])*100000000)+HandlePart(sp[1]))+dotPart;
　　　　　　　　}
　　　　　　　　else
　　　　　　　　{
　　　　　　　　　　if(yCount==0)
　　　　　　　　　　{
　　　　　　　　　　　　result =(neg?-1:1)*HandlePart(pre)+dotPart;
　　　　　　　　　　}
　　　　　　　　}
　　　　　　}
　　　　　　return result;
 
　　　　}
        /// <summary>
        /// 处理亿以下内容。
        /// </summary>
        /// <param name="num"></param>
        /// <returns></returns>
        private static Decimal HandlePart(string num)
        {
            Decimal result = 0;
            string temp = num;
            temp = temp.Replace("万", ",");
            string[] part = temp.Split(',');
            for (int i = 0; i < part.Length; i++)
            {
                result += Convert.ToDecimal(GetArabThousandPart(part[part.Length - i - 1])) * Convert.ToDecimal((System.Math.Pow(10000, Convert.ToDouble(i))));
            }
            return result;
        }

        /// <summary>
        /// 取得阿拉伯数字小数部分。
        /// </summary>
        /// <returns></returns>
        private static Decimal GetArabDotPart(string
        dotpart)
　　　　{
　　　　　　Decimal result = 0.00M;
　　　　　　string spe = "0.";
　　　　　　for(int i=0;i<dotpart.Length;i++)
　　　　　　{
　　　　　　　　spe +=
　　　　　　　　switchNum(dotpart[i].ToString()).ToString();
　　　　　　}
　　　　　　result = Convert.ToDecimal(spe);
　　　　　　return result;
　　　　}

        public static int GetArabThousandPart(string number)
        {

            string ChnNumString = number;
            if (ChnNumString == "零")
            {
                return 0;
            }
            if (ChnNumString != string.Empty)
            {
                if (ChnNumString[0].ToString() == "十")
                {
                    ChnNumString = "一" + ChnNumString;
                }
            }

            ChnNumString = ChnNumString.Replace("零", string.Empty);
            //去除所有的零
            int result = 0;
            int index = ChnNumString.IndexOf("千");
            if (index != -1)
            {
                result +=
                switchNum(ChnNumString.Substring(0
                , index)) * 1000;
                ChnNumString = ChnNumString.Remove(0, index + 1);
            }
            index = ChnNumString.IndexOf("百");
            if (index != -1)
            {
                result +=
                switchNum(ChnNumString.Substring(0
                , index)) * 100;
                ChnNumString =
                ChnNumString.Remove(0, index + 1);
            }
            index = ChnNumString.IndexOf("十");
            if (index != -1)
            {
                result +=switchNum(ChnNumString.Substring(0, index)) * 10;
                ChnNumString = ChnNumString.Remove(0, index + 1);
            }
            if (ChnNumString != string.Empty)
            {
                result += switchNum(ChnNumString);
            }
            return result;
        }
        /// <summary>
        /// 取得汉字对应的阿拉伯数字
        /// </summary>
        /// <param name="n"></param>
        /// <returns></returns>
        private static int switchNum(string n)
        {
            switch (n)
            {
                case "零":
                    {
                        return 0;
                    }
                case "一":
                    {
                        return 1;
                    }
                case "二":
                    {
                        return 2;
                    }
                case "三":
                    {
                        return 3;
                    }
                case "四":
                    {
                        return 4;
                    }
                case "五":
                    {
                        return 5;
                    }
                case "六":
                    {
                        return 6;
                    }
                case "七":
                    {
                        return 7;
                    }
                case "八":
                    {
                        return 8;
                    }
                case "九":
                    {
                        return 9;
                    }
                default:
                    {
                        return -1;
                    }
            }
            return -1;
        }

    }

}